package com.itheima.collectiondemo;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class CollectionTraveralDemo2 {

    public static void main(String[] args) {
        // 目标：认识并发修改异常问题，搞清楚每种遍历的区别
        ArrayList<String> list = new ArrayList<>();
        list.add("java入门");
        list.add("java高并发");
        list.add("黑枸杞");
        list.add("java并发");
        list.add("java发");
        list.add("枸杞子");

        Collection<String> list1 = new ArrayList<>(list);
        Collection<String> list2 = new ArrayList<>(list);
        Collection<String> list3 = new ArrayList<>(list);

        // 1.并发修改异常（普通for循环）
        for (int i = 0; i < list.size(); i++) {
            String s = list.get(i);
            if (s.contains("java")) {
                list.remove(i);
                i--; // 删除了元素，索引值要减1，不然会漏掉一个元素
            }
        }
        System.out.println(list);

//        System.out.println("--------------------");
//        // 2.并发修改异常（增强for循环） 不可以解决这个问题
//        for (String s : list1) {
//            if (s.contains("java")) {
//                list1.remove(s);
//            }
//        }
//        System.out.println(list);

        System.out.println("--------------------");
        // 3.并发修改异常（迭代器）
        Iterator<String> it = list2.iterator();
        while (it.hasNext()) {
            String s = it.next();
            if (s.contains("java")) {
                //list2.remove(s); // 存在并发修改异常
                it.remove(); // 迭代器删除元素没有问题
            }
        }
        System.out.println(list2);

        System.out.println("--------------------");
        //lambda 表达式遍历 不能解决并发修改异常
        list3.forEach(s -> {
            if(s.contains("java")){
                list3.remove(s);
            }
        });

    }
}
